//
//  CJTemplateContainerBaseView.h
//  TSDemo_ImageFilter
//
//  Created by ciyouzen on 2014/5/8.
//  Copyright (c) 2014年 dvlproad. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "CJTemplateBaseView.h"
#import "CJTemplateModel.h"

NS_ASSUME_NONNULL_BEGIN

/// 模板上数据的设置的时机
typedef NS_ENUM(NSUInteger, CJTemplateDataConfigTime) {
    CJTemplateDataConfigTimeCreate,        /**< 创建的时候 */
    CJTemplateDataConfigTimeReset,         /**< 重置的时候 */
    CJTemplateDataConfigTimeExchange,      /**< 交换模板内区域的时候 */
};


@interface CJTemplateContainerBaseView : UIView {
    
}
@property (nonatomic, copy, readonly) void(^templateDataConfigBlock)(CJTemplateBaseView *bTemplateView, id bDataModel, CJTemplateDataConfigTime time, NSInteger templateIndex);    /**< 模板上数据的设置方法 */
@property (nonatomic, strong) CJTemplateModel *realTemplateModel;

@property (nonatomic, strong, readonly) NSMutableArray *dataModels;
@property (nonatomic, strong) NSMutableArray *contentViewArray;

@property (nonatomic, assign, readonly) NSInteger styleIndex;   /**< 当前选择的模板index（从1开始) */
@property (nonatomic, assign, readonly) NSInteger cellCount;    /**< 当前的模板块个数 */

#pragma mark - Init
/*
 *  初始化
 *
 *  @param frame frame
 *  @param templateCreateBlock              模板上子视图的创建方法
 *  @param templateDataConfigBlock          模板上数据的设置方法
 *  @param allowExchange                    是否允许交换
 *  @param templateExchangeCompleteBlock    交换结束的回调
 *
 *  @return 模板整体视图
 */
- (instancetype)initWithFrame:(CGRect)frame
          templateCreateBlock:(CJTemplateBaseView *(^ _Nonnull)(NSInteger templateIndex))templateCreateBlock
      templateDataConfigBlock:(void(^ _Nullable)(CJTemplateBaseView *bTemplateView, id bDataModel, CJTemplateDataConfigTime time, NSInteger templateIndex))templateDataConfigBlock
                allowExchange:(BOOL)allowExchange
        exchangeCompleteBlock:(void(^ _Nullable)(void))templateExchangeCompleteBlock NS_DESIGNATED_INITIALIZER;
+ (instancetype)new NS_UNAVAILABLE;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;


#pragma mark - Update：更新样式
/*
 *  完善模型样式在真正坐标系下的真实信息
 *
 *  @param realTemplateModels               真正的模板模型信息
 *  @param realPointBorderLayerCreateBlock  真正的模板模型信息的边框layer创建(此属性为nil时候表示不设置边框)
                                            (创建layer时候不用提供path和frame,内部会自动补充)
 */
- (void)improveTemplateWithRealTemplateModels:(NSArray<CJTemplatePositionModel *> *)realTemplateModels
              realPointBorderLayerCreateBlock:(CAShapeLayer *(^ _Nullable)(void))realPointBorderLayerCreateBlock;

/*
 *  更新样式
 *
 *  @param realTemplateModel                真正的模板模型信息
 *  @param realPointBorderLayerCreateBlock  真正的模板模型信息的边框layer创建(此属性为nil时候表示不设置边框)
                                            (创建layer时候不用提供path和frame,内部会自动补充)
 */
- (void)updateTemplateWithRealTemplateModel:(CJTemplateModel *)realTemplateModel
            realPointBorderLayerCreateBlock:(CAShapeLayer *(^ _Nullable)(void))realPointBorderLayerCreateBlock;


#pragma mark - Update：更新数据
/*
 *  设置/更新模板快里的数据（不会改变整个模板的形状）
 *
 *  @param dataModels   模板快里的数据
 */
- (void)reloadTemplateCellWithDataModels:(NSArray *)dataModels;

@end

NS_ASSUME_NONNULL_END
